home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (PO)
/
Nibble Volume 10, No. 05 (1989-05)(MicroSPARC)(Side A)[a].zip
/
Nibble Volume 10, No. 05 (1989-05)(MicroSPARC)(Side A)[a].po
/
TEXT.DECRUNCH.S
< prev
next >
Wrap
Text File
|
1996-12-24
|
4KB
|
197 lines
********************************
* TEXT.DECRUNCH Source Code *
* by Howard Huang *
* Copyright (c) 1985 *
* by MicroSPARC, Inc. *
* Concord, MA 01742 *
* *
* Assembler: MERLIN *
********************************
ORG $60B9 ;Place in memory after CRUNCH
*
* --> Equates
*
TEMP = $2 ;Temporary storage
COUNTER = $3 ;Count characters in group
ALLFLAG = $4 ;Decrunch lowercase?
CODE = $6 ;Pointer to encoded text
TEXT = $8 ;Pointer to normal text
LEFT = $A ;Shift left counter
RIGHT = $B ;Shift right counter
*==============
* PROGRAM START
*==============
*
* --> Initialize
*
DECRUNCH LDY #0
LDA ALLFLAG
BNE ALLCHARS ;Decrunch upper AND lower case
*===================
* DECRUNCH UPPERCASE
*===================
BEGIN LDA #0
STA COUNTER ;Init counter
UPPERC LDA (CODE),Y ;Get encoded char
LDX COUNTER
AND MASK1,X ;Get rid of some bits
PHA
LDA LEFTTAB1,X
STA LEFT ;Times to shift left
PLA
JSR MOVELEFT ;Move leftward
LDX COUNTER
CPX #0
BEQ NEXT
CPX #3
BEQ NEXT ;Don't load new byte
JSR INCCODE
NEXT LDA (CODE),Y
AND MASK2,X ;Strip off bits
PHA
LDA RGHTTAB1,X ;Times to shift right
STA RIGHT
PLA
JSR MOVERGHT ;Move right
ORA TEMP
BEQ END ;No more
STA TEMP
AND #$20
CMP #$20 ;Check if bit 5 is on
BEQ MASK80 ;If on, use $80 as mask
LDA #$C0 ;Use $C0 mask
HEX 2C
MASK80 LDA #$80
ORA TEMP ;Tack onto byte
STA (TEXT),Y
INC TEXT ;Next storage space
BNE CONTINUE
INC TEXT+1
CONTINUE INC COUNTER
LDA COUNTER
CMP #4 ;Done with group?
BNE UPPERC ;Not yet
JSR INCCODE ;Start at next group
JMP BEGIN ;Do another group
END STA (TEXT),Y ;Zero last byte
RTS
*
* --> Table of masks and shifts
*
MASK1 DFB $00,$03,$0F,$3F
MASK2 DFB $FF,$FF,$C0,$00
LEFTTAB1 DFB $00,$04,$02,$00
RGHTTAB1 DFB $02,$04,$06,$00
*==============================
* DECRUNCH UPPER AND LOWER CASE
*==============================
ALLCHARS LDA #1
STA COUNTER ;Init COUNTER
LOWERC LDA (CODE),Y ;Get byte of code
LDX COUNTER
CPX #1
BEQ NOAND ;Nothing to AND
AND MASK-1,X ;Erase unwanted bits
CPX #8
BEQ ONEBYTE ;No combining to do
PHA
LDA LEFTTAB-1,X
STA LEFT ;Shift left
PLA
JSR MOVELEFT
JSR INCCODE
NOAND LDX COUNTER
STX RIGHT ;Shift right how much
JSR MOVERGHT
LDX COUNTER
CPX #1
BEQ ONEBYTE ;No combining
ORA TEMP
ONEBYTE CMP #0 ;Check for end
BEQ END ;Quit
ORA #$80 ;Add high bit
STA (TEXT),Y ;Save in buffer
INC TEXT
BNE NEXTCHAR
INC TEXT+1
NEXTCHAR INC COUNTER ;Next in group
LDA COUNTER
CMP #9
BNE LOWERC ;Still same group
JSR INCCODE ;First char of next group
JMP ALLCHARS ;Start another group
*
* --> Table of masks and shifts
*
MASK DFB $00,$01,$03,$07,$0F,$1F,$3F,$7F
LEFTTAB DFB $00,$06,$05,$04,$03,$02,$01,$00
*============
* SUBROUTINES
*============
*
* --> Increment pointer to encoded text
*
INCCODE INC CODE ;Next
BNE INCCODE1
INC CODE+1 ;Next page
INCCODE1 LDA (CODE),Y ;Get byte
RTS
*
* --> Shift byte leftwards
*
MOVELEFT LDX LEFT
LEFT:1 BEQ ENDLEFT
ASL
DEX
JMP LEFT:1 ;Shift again
ENDLEFT STA TEMP ;Save resulting byte
RTS
*
* --> Shift byte right
*
MOVERGHT LDX RIGHT
RGHT:1 BEQ ENDRIGHT ;No more
LSR
DEX
JMP RGHT:1
ENDRIGHT RTS
LST OFF